


"""
生成器：
1、生成器的本质就是迭代器
2、创建生成器的方案两种：
    a.生成器函数
    b.生成器表达式
    c.

生成器函数：
    生成器函数中有一个关键字 yield---------generator
    生成器函数执行的时候，并不会执行函数，得到的是一个生成器，本质就是一个迭代器

    yield:只要函数中有yield，它就是一个生成器
    yield:的执行借助于.__next__来执行，可以将代码分段来执行，多个yield
    yield:可以将代码分段执行，又可以返回一个生成器


"""

# def func():
#     print(123456)
#     yield 777
#
#
#
# ret = func()
# print(ret.__next__())
# print(ret.__next__())



def func():
    print(123456)
    yield 777
    print(321312)
    yield 2345
    print(5435)

ret = func()
print(ret.__next__())
print(ret.__next__())

# def order():
#     lst = []
#     for i in range(10000):
#         lst.append(f"衣服数量{i}")
#     return lst


def order():
    lst = []
    for i in range(1000):
        lst.append(f"衣服{i}")
        # 50个数量返回一次
        if len(lst) == 50:
            abd = yield lst
            # print(abd)
            lst = []

# 这种方式是对的，先将生成器取出来给gen，然后gen通过每次调用返回50个，下次继续上次的数量循环
# gen = order()
# print(gen.__next__())
# # send是把123 传给 yield，然后执行赋值给 abd和之后的操作  send 不仅传值且执行next的动作
# # print(gen.send(123))
# print(gen.__next__())
# print(gen.__next__())


# 这种方式不对，每次都是重新调用这个函数，没有办法持续拿50个数据，每次都是重新开始计数

# print(order().__next__())
# print(order().__next__())


"""
使用方法不能直接用 函数名.__next__()
先赋值  x = order() 取出生成器赋值给变量，得有变量来接受返回值，在 x.__next__()去迭代取其中的元素
"""


# # 生成器表达式--第二节
# list = []
#
# for i in range(10):
#     list.append(i)
# print(list)

# 生成器表达式:一次性的
# 语法：（数据 for循环 if）
gen = (i**2 for i in range(10) )
print(type(gen))
# print(gen.__next__())
# print(gen.__next__())
# print(gen.__next__())
for item in gen:
    print("12123123123123123", item)
  

str1 = list("周杰伦")  # list()==> for ==> next()
print(str1)